package org.domain.sigepac.session;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.domain.sigepac.Utils;
import org.domain.sigepac.Entity.Aluno;
import org.domain.sigepac.Entity.AvaliacaoInformatica;
import org.domain.sigepac.Entity.AvaliacaoInformaticaId;
import org.domain.sigepac.Entity.Turma;
import org.domain.sigepac.Entity.Visita;
import org.domain.sigepac.repository.RepositorioAluno;
import org.domain.sigepac.repository.RepositorioAvaliacaoInformatica;
import org.domain.sigepac.repository.RepositorioTurma;
import org.domain.sigepac.repository.RepositorioVisita;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.international.StatusMessages;

@Name("turmaList")
@Scope(ScopeType.CONVERSATION)
public class TurmaList {


	@In
	private RepositorioTurma repositorioTurma;

	@In
	private RepositorioVisita repositorioVisita;

	@In
	private RepositorioAluno repositorioAluno;

	@In
	private RepositorioAvaliacaoInformatica repositorioAvaliacaoInformatica;

	@In
	private StatusMessages statusMessages;

	@DataModel("listaTurmas")
	private List<Turma> listaTurmas;

	@DataModel("listaVisitas")
	private List<Visita> listaVisitas;

	@DataModel("listaAvaliacoesInformatica")
	private List<AvaliacaoInformatica> listaAvaliacoesInformatica;

	@DataModelSelection("listaTurmas")
	@Out(required=false,scope=ScopeType.CONVERSATION)
	@In(required=false)
	private Turma turma;

	private Visita visita;

	private AvaliacaoInformatica avaliacaoInformatica;

	@Out(required=false)
	private Turma turmaPesquisa;

	private Aluno aluno;

	private Integer paginacao=20;

	private boolean fechada;

	private Date dataFrequencia;

	@Factory("listaTurmas")
	public void listar(){
		if(!isFechada())
			listaTurmas= repositorioTurma.listar();
		else
			listaTurmas=repositorioTurma.listarInativas();
	}

	@Factory("listaVisitas")
	public void listarVisitas(){
		Utils.entityManagerFlush();
		if(turma!=null)
			listaVisitas= new ArrayList<Visita>(turma.getVisitas());
		else
			listaVisitas=Collections.emptyList();

	}

	@Factory("listaAvaliacoesInformatica")
	public void listarAvaliacoesInformatica(){
		if(turma!=null)
			listaAvaliacoesInformatica= new ArrayList<AvaliacaoInformatica>(turma.getAvaliacoesInformatica());
		else
			listaAvaliacoesInformatica=Collections.emptyList();

	}
	public void pesquisar(){
		listaTurmas=repositorioTurma.pesquisarPorNome(getTurmaPesquisa().getNome());
	}

	@End
	public void apagar(){
		if(turma.getAlunos().size()==0){
			repositorioTurma.excluir(turma);
			Utils.entityManagerFlush();
			listar();
			statusMessages.add("Turma exclu\u00edda com sucesso!");
		}else
		{
			statusMessages.add("N\u00e3o foi poss\u00edvel excluir a Turma pois existem alunos vinculadas a ela");
		}
	}

	public void apagarVisita(){
		repositorioVisita.excluir(visita);
		turma.getVisitas().remove(visita);
		visita=new Visita();
		visita.setTurma(turma);
		Utils.entityManagerFlush();
		statusMessages.add("Visita exclu\u00edda com sucesso!");
	}

	public void apagarAvaliacao(){
		repositorioAvaliacaoInformatica.excluir(avaliacaoInformatica);
		turma.getAvaliacoesInformatica().remove(avaliacaoInformatica);
		avaliacaoInformatica=new AvaliacaoInformatica();
		avaliacaoInformatica.setTurma(turma);
		Utils.entityManagerFlush();
		statusMessages.add("Avalia\u00e7\u00e3o exclu\u00edda com sucesso!");
		listarAvaliacoesInformatica();
	}

	public void inserirVisita(){
		visita.setTurma(turma);
		repositorioVisita.inserirOuAtualizar(visita);
		Utils.entityManagerFlush();
		visita=new Visita();
		listar();
		listarVisitas();
	}

	public void removerDaTurma(){
		aluno.getTurmas().remove(turma);
		repositorioAluno.atualizar(aluno);
		turma.setAlunos(null);
		Utils.entityManagerFlush();
	}
	public void inserirAvaliacao(){

		if( ((AvaliacaoInformaticaId) avaliacaoInformatica.getId()).getIdAluno()  ==null){
			AvaliacaoInformaticaId id=new AvaliacaoInformaticaId();
			id.setIdAluno((Integer) avaliacaoInformatica.getAluno().getId());
			id.setIdTurma((Integer) avaliacaoInformatica.getTurma().getId());
			avaliacaoInformatica.setId(id);
		}
		repositorioAvaliacaoInformatica.inserirOuAtualizar(avaliacaoInformatica);
		Utils.entityManagerFlush();
		avaliacaoInformatica=new AvaliacaoInformatica();
		listarAvaliacoesInformatica();

	}

	public void cancelar(){
		setVisita(null);
	}
	public Integer getPaginacao() {
		return paginacao;
	}

	public Turma getTurmaPesquisa() {
		if(turmaPesquisa==null)
			turmaPesquisa=new Turma();
		return turmaPesquisa;
	}

	public void setTurmaPesquisa(Turma turmaPesquisa) {
		this.turmaPesquisa = turmaPesquisa;
	}

	public Turma getTurma() {
		return turma;
	}
	public void setTurma(Turma turma) {
		this.turma = turma;
	}

	public Visita getVisita() {
		if(visita==null){
			visita=new Visita();
			visita.setTurma(turma);
		}
		return visita;
	}

	public void setVisita(Visita visita) {
		this.visita = visita;
	}

	public AvaliacaoInformatica getAvaliacaoInformatica() {
		if(avaliacaoInformatica==null){
			avaliacaoInformatica=new AvaliacaoInformatica();
			avaliacaoInformatica.setTurma(turma);
		}
		return avaliacaoInformatica;
	}
	public void setAvaliacaoInformatica(
			AvaliacaoInformatica avaliacaoInformatica) {
		this.avaliacaoInformatica = avaliacaoInformatica;
	}

	public void setFechada(boolean fechada) {
		this.fechada = fechada;
	}
	public boolean isFechada() {
		return fechada;
	}

	public Date getDataFrequencia() {
		return dataFrequencia;
	}
	public void setDataFrequencia(Date dataFrequencia) {
		this.dataFrequencia = dataFrequencia;
	}

	public Aluno getAluno() {
		return aluno;
	}
	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}
}
